package main

import "fmt"

func main() {
	//Go语言中的变量和常量
	//Go语言中变量的声明
	//Go语言变量是由字母、数字、下划线组成，其中首个字符不能为数字。Go语言中关键字和保留字都不能用作变量名
	//Go语言中变量需要声明后才能使用，同一作用域内不支持重复声明。并且Go语言的变量声明后必须使用。
	//变量声明后，没有初始化，打印出来的是空
	//	如何定义变量
	//	方式1
	//显示定义 var 变量名 = 变量值
	var name = "zhangjiahong"
	//	打印变量！！！！！！ 变量定义了 一定要使用
	fmt.Println(name)
	//	方式2 带类型得显示定义 var 变量名 变量数据类型  = 变量值
	var name2 string = "zhangjiahong2"
	fmt.Println(name2)
	//方式3：类型推导方式定义变量
	//a在函数内部，可以使用更简略的 := 方式声明并初始化变量
	//注意：短变量只能用于声明局部变量，不能用于全局变量声明
	//	变量名 := 变量值 局部局部局部！！！ 函数内函数内函数内！！！
	name3 := "zhangjiahong3"
	fmt.Println(name3)
	//	方式4 同时声明多个变量
	// 第一种情况 变量得类型是相同的
	//	var 变量名1，变量名2，变量名3 类型
	var name4, name5, name6 string
	// 注意上述生命得name4, name5, name6均为空值
	// 赋值
	name4 = "zhangjiahong4"
	name5 = "zhangjiahong5"
	name6 = "zhangjiahong6"
	fmt.Println(name4, name5, name6)
	//	第二种情况 变量类型不一样
	var (
		name7 string
		age1  int
	)
	name7 = "zhangjiahong7"
	age1 = 30
	fmt.Println(name7, age1)
	//如何定义常量
	//相对于变量，常量是恒定不变的值，多用于定义程序运行期间不会改变的那些值。常量的声明和变量声明非常类似，只是把var换成了const，常量在定义的时候必须赋值。
	//	定义常量的时候 可以不用立即使用
	const pi = 3.1415926
	//fmt.Println(pi)
	//	定义两个常量
	const (
		a = 100
		b = "im a const"
	)
	//fmt.Println(a, b)
	// const同时声明多个常量时，如果省略了值表示和上面一行的值相同
	const (
		c = 100
		d
		e
	)
	//fmt.Println(c, d, e)
	//Const常量结合iota的使用
	//iota是golang 语言的常量计数器，只能在常量的表达式中使用
	//iota在const关键字出现时将被重置为0（const内部的第一行之前），const中每新增一行常量声明将使iota计数一次（iota可理解为const语句块中的行索引）。
	//每次const出现，都会让iota初始化为0【自增长】
	const f = iota
	const (
		g = iota
		h
		i
		j
	)
	const (
		k = iota
		_
		m
		n
	)
}
